//WA
#include <vector>
#include <set>
#include <algorithm>
#include <string>
#include <cmath>
#include <queue>
#include <map>
#include <iostream>
#include <list>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;


int  rep[10001];
int rank[10001];
bool conj[10001];
void _make_set(int x){
	rep[x]=x;
	rank[x]=0;
}

int _find_set(int x){
	if(x!=rep[x])
		rep[x]=_find_set(rep[x]);
	return rep[x];
}

void _link(int x, int y){
	if(rank[x]>rank[y]){
		rep[y] = x;
	}
	else{
		rep[x]=y;
		if(rank[x]==rank[y]){
			rank[y]++;
		}
	}
}

void _union(int x, int y){
	_link(_find_set(x),_find_set(y));
}


int n, m, i, j, k, sum, x, y;
char s[100][102];
int d[8][2]={{0,-1},{-1,0},{1,-1},{-1,1},{-1,-1},{1,0},{0,1},{1,1}};
int main (){
	//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);
	scanf("%d%d", &n, &m);
	for(i=0;i<n;++i){
		scanf("%s", s[i]);
	}
	memset(rep,0,sizeof(rep));
	for(i=0;i<n;++i){
		for(j=0;j<m;++j){
			if( (s[i][j]=='W') && (rep[i*m+j]==0) ){
				_make_set(i*m+j);
				for(k=0;k<8;++k){
					x=i+d[k][0];
					y=j+d[k][1];
					if((0<=x&&x<n)&&(0<=y&&y<m)){
						if(s[x][y]=='W'){
							if(rep[x*m+y]==0){
								_make_set(x*m+y);
							}
							_union(x*m+y, i*m+j);
							_find_set(i*m+j);
							_find_set(x*m+y);
						}
					}
				}

			}
		}
	}
	for(i=0,j=(n-1)*m+m;i<j;++i){
		_find_set(i);
	}

	memset(conj,0,sizeof(conj));
	for(i=0,j=(n-1)*m+m;i<j;++i){
		if(rep[i])conj[rep[i]]=1;
	}
	sum=0;
	for(i=0,j=(n-1)*m+m;i<j;++i){
		sum+=conj[i];
	}

	// for(i=0;i<n;++i){
		// for(j=0;j<m;++j)printf("%d ", rep[i*m+j]);
		// printf("\n");
	// }
	
	printf("%d", sum);
	
	
	
	return 0;
}
